# 运算符：算术、比较、逻辑、赋值、位运算、海象运算（3.9版本）

''' 1. 算术： +  -  *  /  //整除   %求余  **求幂 '''
# 优先级：**最高，（* / // %），（+ -）最低
print(10//3, 11%3, 4**2)
print('hello' + 'python')
print('hello' * 3)
print([1,2,3] + [4,5,6])

''' 2. 比较：>  <  ==等于  >=  <=   !=不等，返回布尔值 True 、 False'''
print(3>2)  # True
# is 、in 特殊的比较运行
# is 比较2个对象的内存地址，和值
# in()  1 in (1,2,3)

''' 3. 逻辑：not非、and与  or或 优先级依次降低 
not 取反，条件为真，结果为假
and 与-和，多个条件同时为 True，结果为 True，否则为 False
or 或，多个条件同时为 False，结果为 False，否则为 True
'''
print(3>2 and 4>5)
print(not 2>3 or ('a'>'b' and 4>5))       # True

print('a'>'b')      # A=65，a=97

print(not 2>3 or ('a'<'b' and 4>5))
 # True  or （True and  False）

''' 4.赋值运算 '''
# 1）简单赋值使用等于号
name = 'yoyo'       # 把 yoyo 值，赋给变量 name

# 2）链式赋值，内存地址不变
a = b = c = '1'       # a= 1 , b=1 , c=1
print(id(a),id(b),id(c))

# x = y = [1,2,3]     # [1,2,3] 列表可变类型
# print(id(x),id(y))      # 2821665469056 2821665469056

x = [1,2,3]         # 可变类型，值相同，内存地址不同
y = [1,2,3]
print(id(x),id(y))      # 2821665531520 2821665468544
print(x is y)           # False
print(1 in (1,2,3))      # 1 在对象中

print(1 not in(1,2,3))  # False     1 不在对象
print(not 1 in(1,2,3))  # False     1 在对象中，取反

# 3）解包赋值（元组赋值）
x, y, z = 1, 'a', 'python'
a, _, c = 1, 2, 3

# 4）算术赋值：算术 + 简单赋值  +=、-=、*=、....
# 先进行算术，在赋值
i = 1
i += 2      # ==>  i = i + 2
i %= 2      # i % 2 求余，在赋值
print(i)


''' 5. 位运算：把数字转化为二进制，在进行位移 '''
# >> 按位右移、<< 按位左移、 &按位与、|按位或、~按位取反、^按位异
# # >> 按位右移：低位舍去，高位补零
print(20 >> 2)  # 5
# 先把 20 转化为 2进制 ： 10100  --> 00101 --> 5

# << 按位左移：低位补零，高位不变
print(20 << 3)      # 1010 0000   128 + 32 = 160
print(20 >> 2)
print(30 ^ 40)      # 8
# 30：011110
# 40：101000
# &   110110
# print(~ 20)
# print(~ -30)
# &按位与：同为1结果为1，否则为0
# |按位或：同为0结果为0，否则为1
# ~按位取反：-(数字)-1 = -20-1
# ^按位异：不同为 1，相同为 0


''' 海象赋值 '''
# 变量 := 表达式   # 表达式的结果赋值给变量